﻿#pragma once
#include <ossSocket.h>
#include <ossSocketCtrl.h>
#include <ossThread.h>
#include <ossTaskScheduler.h>
#include <ossMsgBase.h>



/**
 *      验证接收实例是否有效
 * @pcCheckContext		需要检查的上下文实例
 */
typedef Bool(*CheckReceiverValidateFun)(void* pcCheckContext, void* pContext);


class OssThreadTask : public OssMsgBase
{
public:
	OssThreadTask();
	virtual ~OssThreadTask(void);

	/**
	 * 获取当前任务调度器
	*/
	OssTaskScheduler& GetTaskScheduler();

	/**
	 * 获取当前socket控制器
	*/
	Handle& GetSocketCtrl();

	/**
	 * 获取当前任务队列中的任务数
	*/
	int getClientNum();  

	/**
	 *		启动线程
	 */
	void StartThread();

	/**
	 *		停止线程
	 */
	void StopThread();

	/**
	 *		增加socket
	 */
	Bool AddSocketItem(CheckReceiverValidateFun    fCheckFun
		, void* lpCheckContext
		,Socket socket
		, SocketCallback callback, void* lpcontext);

	/**
	 *		移除socket，并且等待移除完成
	 */
	Bool RemoveSocketItem(Socket socket);

	/**
	  *     增加任务，带参数
	  *@pcTaskReceiver	任务接收实例
	  *@taskFun		任务的回调函数
	  *@dwDelayMsecs	放入多长时间后执行(单位毫秒)
	  *@return			成功返回TRUE
	  *					否则返回FALSE
	  */
	Bool AddTask(CheckReceiverValidateFun    fCheckFun
				,void* lpCheckContext
				,void* pcTaskReceiver, OssTaskCallbackFun taskFun, void* pTaskParam, int iTaskParamLen, DWord dwDelayMsecs);
	
	/**
	 *		通过接收者删除所有任务
	 */
	Bool DeleteByReceiver(void* pcTaskReceiver);

	/**
	 *		判断线程是否死了
	 */
	Bool IsDeath();
protected:
	static DWord ThreadFunc(LPVoid lpParameter);  //新线程的线程回调函数
	void ServerThread();

	/**
	 *		探测ToThread任务
	 */
	void ToThreadProbe();
private:
	OssCritical				m_toThreadCritical;
	OssListNode				m_toThreadList;

	OssTaskScheduler		m_taskScheduler;	//提供给httpProxyClient使用
	Handle					m_hSocketCtrl;		//提供给httpProxyClient使用
	OssMutex				m_tThreadMutex;		//线程锁
	volatile Bool			m_bRunning;
	Handle					m_hThread;
	DWord					m_dwTickcount;
};
